<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script>
			let arr = [1, [2, 3, [4],[5, 6, [7]]], 8] //[1,2,3,4,5,6,7,8]
			//这个有很多方法，我们一一说来
			//第一种遍历数组，遍历过程遇到数组递归。
			function flatten(arr, newArr) {
				//省去全局变量，还避开了函数嵌套闭包的形成。
				newArr = newArr || []
				for (let i = 0; i < arr.length; i++) {
					//如果是arr[i]是数组那么递归执行，并把当前arr[i]和已有newArr传进去继续push。
					//如果不是直接push到newArr
					typeof arr[i] === 'object' ? flatten(arr[i], newArr) : newArr.push(arr[i])
				}
				return newArr
			}
			console.log(flatten(arr))
			//第二种，逻辑一样只不过遍历换成了reduce，如果读的比较困难请移步：https://segmentfault.com/a/1190000017510301 了解reduce
			function flatten1(arr) {
				return arr.reduce((newArr, item) => {
					return typeof item === 'object' ? newArr.concat(flatten1(item, newArr)) : (newArr.push(item), newArr)
				}, [])
			}
			console.log(flatten1(arr))
			//第三种比较简单
			function flatten2(arr) {
				//join会默认过滤数组内部[]，算是一个奇淫技巧。
				return arr.join(',').split(',')
			}
			console.log(flatten2(arr))
			//第三种稍有点问题，如果数组内是number类型会拍平后会变成字符串。
		</script>
	</body>
</html>
